/**
*
*  Elaborado por: Roberto Loaeza Valerio.
*                 geoAPP.
*                 26-abr-2006.
*
**/
package metodos;

public class LevantamientoPorPoligonalesAux {
	public double 	anguloMedido;
	public double 	anguloCorregido;
	public double 	distancia;
	public double 	azimut1;
	public double 	azimut2;
	public boolean	norte;
	public boolean 	este;	
	public double 	dRMC;
	public String 	sRMC;
	public String 	sRMC2;
	public double 	cosenoRMC;
	public double 	senoRMC;
	public double 	pc_ny;
	public double 	pc_sy;
	public double 	pc_ex;
	public double 	pc_wx;
	public double 	correcy;
	public double 	correcx;
	public double 	pc_nyc;
	public double 	pc_syc;
	public double 	pc_exc;
	public double 	pc_wxc;
	public double 	corry;
	public double 	corrx;
	
	public LevantamientoPorPoligonalesAux() {
		
	}
	
	/**
	 * 
	 * Calcula el valor de la correcion para utilizar al momento de corregir las proyecciones calculadas
	 * @param KY KY
	 * @param KX KX
	 */
	public void CalcularCorreccionX_Y(double KY, double KX){
		correcy=norte?pc_ny*KY:pc_sy*KY;
		correcx= este?pc_ex*KX:pc_wx*KX;
	}
	
	/**
	 * 
	 * Corrige las Proyecciones Calculadas
	 *
	 */
	public void CalcularPCC() {
		pc_exc=este?pc_ex+correcx:0;
		pc_wxc=este?0:(-1)*pc_wx+correcx;
		
		pc_nyc=norte?pc_ny+correcy:0;
		pc_syc=norte?0:(-1)*pc_sy+correcy;				

	}
	
	/**
	 * 
	 * Calcula las Proyecciones Calculadas
	 *
	 */
	public void CalcularPC() {
		pc_ny=norte?cosenoRMC*distancia:0;
		pc_sy=norte?0:cosenoRMC*distancia;
		pc_ex=este?senoRMC*distancia:0;
		pc_wx=este?0:senoRMC*distancia;
	}
	/**
	 * 
	 * Calcula los senos y cosenos de RMC
	 *
	 */
	public void CalcularSin_CosRMC() {
		cosenoRMC = (Math.cos(dRMC*Math.PI/180));
		senoRMC   = (Math.sin(dRMC*Math.PI/180));
	}

	
	/**
	 * 
	 * Calcula los RMC
	 *
	 */
	public void CalcularRMC() {
		norte = ( (azimut1<=90) || (azimut1>=270) )?true:false;
		este= azimut1 <= 180 ? true:false;
		
		if(this.norte)
		{
			dRMC =este ? azimut1:360-azimut1;
			double rmcDXF = (int)(dRMC*(1000));
			rmcDXF=rmcDXF/(1000);
			sRMC =este?"N"+String.valueOf(rmcDXF)+"E":"N"+String.valueOf(rmcDXF)+"W";
			sRMC2 =este?"N"+String.valueOf(dRMC)+"E":"N"+String.valueOf(dRMC)+"W";									
		}
		else
		{			
			dRMC= este ?180-azimut1:azimut1-180;
			double rmcDXF = (int)(dRMC*(1000));
			rmcDXF=rmcDXF/(1000);
			sRMC =este?"S"+String.valueOf(rmcDXF)+"E":"S"+String.valueOf(rmcDXF)+"W";
			sRMC2 =este?"S"+String.valueOf(dRMC)+"E":"S"+String.valueOf(dRMC)+"W";			
		}
		
	}
	
	/**
	 * Genera un nuevo azimut
	 * @param angulo_anterior Angulo Anterior
	 * @param angulo_medido Angulo actual
	 * @return Regresa el nuevo azimut, posiblemente requiera validarse
	 */
	public double NuevoAzimut(double angulo_anterior, double angulo_medido) {
		return angulo_anterior<=180?angulo_anterior+angulo_medido+180:angulo_anterior+angulo_medido-180;
	}
	/**
	 * Valida que un azimut este en el rango valido (0 a 360)
	 * @param azimut Azimut a validar
	 * @return Azimut validado
	 */
	public double ValidaAzimut(double azimut){
		return azimut>=360?azimut-360:azimut;
	}
	
	/**
	 * Corrige el azimut.
	 * @param ang_ant Angulo Anterior
	 * @return El nuevo valor del azimut
	 */
	public double FixAzimut1(double ang_ant) {
		return ( azimut1=ValidaAzimut(NuevoAzimut(ang_ant,this.anguloCorregido)) );
	}
	
}
